﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows.Forms;

namespace Gestión_UTN.View.alta
{
    public partial class AltaInscripcionExamen : Form
    {
        private static Gestión_UTN.bl.alumnobl createAlumno = Gestión_UTN.factories.blfactory.createAlumno();
        private static Gestión_UTN.bl.fechaExamenbl createFechaExamen = Gestión_UTN.factories.blfactory.createFechaExamen();
        private static Gestión_UTN.bl.inscripcionExamenbl createInscripcionExamen = Gestión_UTN.factories.blfactory.createInscripcionExamen();
        private static Gestión_UTN.bl.materiabl createMateria = Gestión_UTN.factories.blfactory.createMateria();
        private static Gestión_UTN.bl.regularidadbl createRegularidad = Gestión_UTN.factories.blfactory.createRegularidad();
        private static Gestión_UTN.bl.aprobadabl createAprobada = Gestión_UTN.factories.blfactory.createAprobada();

        private static DataTable fechasExamenes;
        private static int d;
        private static DateTime f;
        private static string t;
        private static string c;
        private static string m;

        public AltaInscripcionExamen()
        {
            InitializeComponent();
        }

        private void btnNuevoAlumno_Click(object sender, EventArgs e)
        {
            AltaAlumno alta = new AltaAlumno();

            if (alta.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                this.txtDNI.Text = alta.DNI.ToString();
            }
        }

        private void AltaInscripcionExamen_Load(object sender, EventArgs e)
        {
            fechasExamenes = createFechaExamen.FindAllFechas();

            if (null != fechasExamenes)
            {
                this.dgvFechas.Rows.Clear();

                foreach (DataRow dr in fechasExamenes.Rows)
                {
                    this.dgvFechas.Rows.Add(Convert.ToDateTime(dr["fe_fecha"].ToString()).ToShortDateString(),
                        dr["tie_tipo"], dr["mat_nombre"], dr["car_nombre"]);
                }
            }

            refreshData();
        }

        private void btnNuevaFecha_Click(object sender, EventArgs e)
        {
            general.FechasExamenes alta = new general.FechasExamenes();

            alta.FormClosed += new FormClosedEventHandler(alta_FormClosed);

            alta.Show();
        }

        void alta_FormClosed(object sender, FormClosedEventArgs e)
        {
            fechasExamenes = createFechaExamen.FindAllFechas();

            if (null != fechasExamenes)
            {
                this.dgvFechas.Rows.Clear();

                foreach (DataRow dr in fechasExamenes.Rows)
                {
                    this.dgvFechas.Rows.Add(Convert.ToDateTime(dr["fe_fecha"].ToString()).ToShortDateString(),
                        dr["tie_tipo"], dr["mat_nombre"], dr["car_nombre"]);
                }
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.dgvFechas.CurrentCell.Value != null && ValidarCorrelatividades())
                {
                    int dni = Convert.ToInt32(this.txtDNI.Text);

                    bo.InscripcionExamenAlumnobo inscAlu = createInscripcionExamen.FindInscripcionByDNI(dni);

                    DateTime fecha = Convert.ToDateTime(this.dgvFechas.CurrentRow.Cells[0].Value.ToString());

                    string materia = this.dgvFechas.CurrentRow.Cells[2].Value.ToString();

                    int mat_id = Convert.ToInt32(createMateria.FindAllMaterias().Select("mat_nombre = '" + materia + "'")[0]["mat_id"]);

                    bo.FechaExamenbo fec = inscAlu.Fechas.Find(fe => fe.Fe_fecha == fecha && fe.Materia.Id == mat_id);

                    if (null == fec)
                    {
                        int fe_id = Convert.ToInt32(fechasExamenes.Select("fe_fecha = '" + fecha + "' AND mat_nombre = '" + materia + "'")[0]["fe_id"]);

                        bool ingresada = createInscripcionExamen.SaveInscripcionExamen(dni, fe_id);

                        if (ingresada)
                        {
                            MessageBox.Show("Inscripción Registrada!!", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            refreshData();
                        }
                        else
                        {
                            MessageBox.Show("Error al Registrar!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }
                    }
                    else
                    {
                        MessageBox.Show("Inscripción ya Registrada!!", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
            }
            catch (exceptions.blexception)
            {
                MessageBox.Show("Error al Intentar Guardar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Intentar Guardar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.dgvFechas.CurrentCell.Value != null)
                {
                    int fe_id_anterior = Convert.ToInt32(fechasExamenes.Select("fe_fecha = '" + f + "' AND mat_nombre = '" + m + "'")[0]["fe_id"]);

                    int alu_dni = Convert.ToInt32(this.txtDNI.Text);

                    string nfecha = this.dgvFechas.CurrentRow.Cells[0].Value.ToString();

                    string materia = this.dgvFechas.CurrentRow.Cells[2].Value.ToString();

                    int fe_id = Convert.ToInt32(fechasExamenes.Select("fe_fecha = '" + nfecha + "' AND mat_nombre = '" + materia + "'")[0]["fe_id"]);

                    bool modificada = createInscripcionExamen.ModifyInscripcionExamen(d, fe_id_anterior, alu_dni, fe_id);

                    if (modificada)
                    {
                        MessageBox.Show("Inscripción Modificada!!", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        refreshData();
                    }
                    else
                    {
                        MessageBox.Show("Error al Modificar!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
            }
            catch (exceptions.blexception)
            {
                MessageBox.Show("Error al Intentar Modificar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Intentar Modificar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }
        }

        private void txtDNI_TextChanged(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(this.txtDNI.Text))
            {
                return;
            }
        }

        private void dgvInscripciones_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.dgvInscripciones.CurrentCell.Value != null)
            {
                d = Convert.ToInt32(this.dgvInscripciones.CurrentRow.Cells[0].Value);

                f = Convert.ToDateTime(this.dgvInscripciones.CurrentRow.Cells[1].Value);

                t = this.dgvInscripciones.CurrentRow.Cells[2].Value.ToString();

                m = this.dgvInscripciones.CurrentRow.Cells[3].Value.ToString();

                c = this.dgvInscripciones.CurrentRow.Cells[4].Value.ToString();

                this.txtDNI.Text = d.ToString();
            }
        }

        private void refreshData()
        {
            DataTable inscripciones = createInscripcionExamen.FindAllInscripcionExamen();

            if (null != inscripciones)
            {
                this.dgvInscripciones.Rows.Clear();

                foreach (DataRow dr in inscripciones.Rows)
                {
                    this.dgvInscripciones.Rows.Add(dr["alu_dni"], dr["fe_fecha"],
                        dr["tie_tipo"], dr["mat_nombre"], dr["car_nombre"]);
                }
            }
        }

        private bool ValidarCorrelatividades()
        {
            bool validarCursadas = false;
            bool validarRendidas = false;

            try
            {
                if (this.dgvFechas.CurrentRow.Cells[3].Value.ToString().Equals("Tecnicatura Superior en Programación"))
                {
                    string materia = this.dgvFechas.CurrentRow.Cells[2].Value.ToString();

                    Gestión_UTN.util.CorrelatividadTSP corr = Gestión_UTN.util.Correlatividades.GetCorrelatividadesTSPByMateria(materia);

                    if (corr.Para_rendir.Contains('-'))
                    {
                        string[] cursadas = corr.Para_cursar_cursada.Split('-');

                        List<bo.Regularidadbo> regulares = createRegularidad.FindRegularidadByDni(Convert.ToInt32(this.txtDNI.Text));
                        List<bo.Aprobadabo> aprobadas = createAprobada.FindAprobadaByDni(Convert.ToInt32(this.txtDNI.Text));

                        int cont = 0;

                        foreach (var reg in regulares)
                        {
                            if (reg.Materia.Nombre.Equals(materia))
                            {
                                validarCursadas = true;
                            }
                        }

                        foreach (var apr in aprobadas)
                        {
                            foreach (var cur in cursadas)
                            {
                                if (apr.Materia.Nombre.Equals(cur))
                                {
                                    cont += 1;
                                }
                            }
                        }

                        validarRendidas = (cont == cursadas.Length) ? true : false;

                        if (!validarCursadas || !validarRendidas)
                        {
                            View.util.Mensaje mensaje = new util.Mensaje();

                            mensaje.Titulo = "Atención";

                            mensaje.Message = "Debe Rendir: " + corr.Para_rendir;
                            mensaje.Message += "\nDebe Regularizar: " + materia;

                            mensaje.ShowDialog();
                        }
                    }
                    else if (!corr.Para_rendir.Equals(""))
                    {
                        List<bo.Regularidadbo> regulares = createRegularidad.FindRegularidadByDni(Convert.ToInt32(this.txtDNI.Text));
                        List<bo.Aprobadabo> aprobadas = createAprobada.FindAprobadaByDni(Convert.ToInt32(this.txtDNI.Text));

                        foreach (var reg in regulares)
                        {
                            if (reg.Materia.Nombre.Equals(materia))
                            {
                                validarCursadas = true;
                            }
                        }

                        foreach (var apr in aprobadas)
                        {
                            if (apr.Materia.Nombre.Equals(corr.Para_rendir))
                            {
                                validarRendidas = true;
                            }
                        }

                        if (!validarCursadas || !validarRendidas)
                        {
                            View.util.Mensaje mensaje = new util.Mensaje();

                            mensaje.Titulo = "Atención";

                            mensaje.Message = "Debe Rendir: " + corr.Para_rendir;
                            mensaje.Message += "\nDebe Regularizar: " + materia;

                            mensaje.ShowDialog();
                        }
                    }
                    else
                    {
                        validarCursadas = true;
                        validarRendidas = true;
                    }
                }
                else
                {
                    string materia = this.dgvFechas.CurrentRow.Cells[2].Value.ToString();

                    Gestión_UTN.util.CorrelatividadTSMI corr = Gestión_UTN.util.Correlatividades.GetCorrelatividadesTSMIByMateria(materia);

                    if (corr.Correlatividad.Contains('-'))
                    {
                        string[] cursadas = corr.Correlatividad.Split('-');

                        List<bo.Regularidadbo> regulares = createRegularidad.FindRegularidadByDni(Convert.ToInt32(this.txtDNI.Text));

                        int cont = 0;

                        foreach (var reg in regulares)
                        {
                            foreach (var cur in cursadas)
                            {
                                if (reg.Materia.Nombre.Equals(cur))
                                {
                                    cont += 1;
                                }
                            }
                        }

                        validarRendidas = validarCursadas = (cont == cursadas.Length) ? true : false;

                        if (!validarCursadas)
                        {
                            View.util.Mensaje mensaje = new util.Mensaje();

                            mensaje.Titulo = "Atención";

                            mensaje.Message = "Debe Regularizar y/o Aprobar: " + corr.Correlatividad;

                            mensaje.ShowDialog();
                        }
                    }
                    else if (!corr.Correlatividad.Equals(""))
                    {
                        List<bo.Regularidadbo> regulares = createRegularidad.FindRegularidadByDni(Convert.ToInt32(this.txtDNI.Text));

                        foreach (var reg in regulares)
                        {
                            if (reg.Materia.Nombre.Equals(corr.Correlatividad))
                            {
                                validarCursadas = true;
                                validarRendidas = true;

                                break;
                            }
                        }

                        if (!validarCursadas)
                        {
                            View.util.Mensaje mensaje = new util.Mensaje();

                            mensaje.Titulo = "Atención";

                            mensaje.Message = "Debe Regularizar y/o Aprobar: " + corr.Correlatividad;

                            mensaje.ShowDialog();
                        }
                    }
                    else
                    {
                        validarRendidas = true;
                        validarCursadas = true;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Validar Correlatividades!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                validarCursadas = false;
                validarRendidas = false;

                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }

            return (validarRendidas && validarCursadas);
        }
    }
}
